One-to-Many এবং Many-to-One হল Hibernate এর মধ্যে সাধারণভাবে ব্যবহৃত association types যা দুটি entity এর মধ্যে সম্পর্ক বা relationship নির্ধারণ করে। এগুলি object-relational mapping (ORM) সম্পর্কিত ধারণা, যা আপনাকে ডেটাবেস টেবিলের মধ্যে সম্পর্ক তৈরি করার জন্য সাহায্য করে।
এখানে, আমরা One-to-Many এবং Many-to-One সম্পর্কের মধ্যে পার্থক্য এবং কীভাবে এই সম্পর্কগুলো Hibernate-এ তৈরি করা হয়, তা বিস্তারিতভাবে আলোচনা করব।
1. One-to-Many Association
One-to-Many সম্পর্ক তখন হয় যখন একটি entity অন্য একাধিক entity এর সাথে সম্পর্কিত থাকে। এর মানে হলো যে, এক entity এর একাধিক ইনস্ট্যান্স অন্য একটি entity এর সাথে সম্পর্কিত হতে পারে।
One-to-Many সম্পর্কের উদাহরণ:
ধরা যাক, একজন Author একাধিক Book এর সাথে সম্পর্কিত। এখানে, একজন Author এর অনেক Book থাকতে পারে, কিন্তু একটি Book এর শুধুমাত্র একটি Author থাকবে।
Hibernate Mapping Example (One-to-Many)
Author.java (One-to-Many):
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import java.util.Set;
@Entity
public class Author {
@Id
private int id;
private String name;
@OneToMany(mappedBy = "author")
private Set<Book> books;
// Constructor, getters, and setters
public Author() {}
public Author(int id, String name) {
this.id = id;
this.name = name;
}
public Set<Book> getBooks() {
return books;
}
public void setBooks(Set<Book> books) {
this.books = books;
}
// Other getters and setters
}
Book.java (Many-to-One):
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
@Entity
public class Book {
@Id
private int id;
private String title;
@ManyToOne
private Author author;
// Constructor, getters, and setters
public Book() {}
public Book(int id, String title, Author author) {
this.id = id;
this.title = title;
this.author = author;
}
public Author getAuthor() {
return author;
}
public void setAuthor(Author author) {
this.author = author;
}
// Other getters and setters
}
ব্যাখ্যা:
AuthorEntity-এ @OneToMany(mappedBy = "author") অ্যানোটেশন ব্যবহার করা হয়েছে। এটি নির্দেশ করে যে Author Entity এর সাথে সম্পর্কিত Book এর ইনস্ট্যান্স গুলো একাধিক হতে পারে।mappedByএর মাধ্যমেauthorফিল্ডটি Book Entity এর মধ্যে সম্পর্ককে নির্দেশ করে।BookEntity-এ @ManyToOne অ্যানোটেশন ব্যবহার করা হয়েছে, যা নির্দেশ করে যে একটি Book এর শুধুমাত্র একটি Author থাকবে।
2. Many-to-One Association
Many-to-One সম্পর্ক তখন হয় যখন একাধিক entity অন্য একটি entity এর সাথে সম্পর্কিত থাকে। এটি সাধারণত One-to-Many সম্পর্কের বিপরীত, যেখানে একাধিক child entity একটি parent entity এর সাথে সম্পর্কিত হয়।
Hibernate Mapping Example (Many-to-One)
Book.java (Many-to-One):
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
@Entity
public class Book {
@Id
private int id;
private String title;
@ManyToOne
private Author author;
// Constructor, getters, and setters
public Book() {}
public Book(int id, String title, Author author) {
this.id = id;
this.title = title;
this.author = author;
}
public Author getAuthor() {
return author;
}
public void setAuthor(Author author) {
this.author = author;
}
// Other getters and setters
}
Author.java (One-to-Many):
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import java.util.Set;
@Entity
public class Author {
@Id
private int id;
private String name;
@OneToMany(mappedBy = "author")
private Set<Book> books;
// Constructor, getters, and setters
public Author() {}
public Author(int id, String name) {
this.id = id;
this.name = name;
}
public Set<Book> getBooks() {
return books;
}
public void setBooks(Set<Book> books) {
this.books = books;
}
// Other getters and setters
}
ব্যাখ্যা:
BookEntity-এ @ManyToOne অ্যানোটেশন ব্যবহার করা হয়েছে, যা Book এর একটি instance এর সাথে Author এর সম্পর্ক স্থাপন করে। এটি নির্দেশ করে যে অনেকগুলো Book একটি Author এর সাথে সম্পর্কিত হতে পারে।AuthorEntity-এ @OneToMany অ্যানোটেশন ব্যবহার করা হয়েছে, যা Author এর সাথে সম্পর্কিত একাধিক Book কে ম্যাপ করে।
3. Cascade Operations
Hibernate cascade operations সাপোর্ট করে, যার মাধ্যমে আপনি একটি entity এর পরিবর্তনগুলো অন্য সম্পর্কিত entities-এ (যেমন Books এর ক্ষেত্রে Author) cascade করতে পারেন। উদাহরণস্বরূপ, যদি একটি Author ডিলিট করা হয়, তবে সম্পর্কিত সব Book গুলিও ডিলিট করা হতে পারে। Cascade অপারেশন One-to-Many এবং Many-to-One উভয় সম্পর্কেই কার্যকরী।
Cascade Example:
@OneToMany(mappedBy = "author", cascade = CascadeType.ALL)
private Set<Book> books;
এখানে cascade = CascadeType.ALL দিয়ে সব ধরনের cascade অপারেশন (যেমন, persist, merge, remove) Book গুলির উপর প্রযোজ্য হবে যখন Author এর অবস্থা পরিবর্তিত হবে।
4. Fetch Types: Lazy vs Eager
Hibernate সম্পর্কের লোডিংকে নিয়ন্ত্রণ করার জন্য fetch type সাপোর্ট করে। এর মধ্যে দুটি মূল ধরন রয়েছে:
- Lazy Fetching: সম্পর্কিত entities কেবল তখনই লোড হবে যখন প্রয়োজন হবে। এটি default fetch type।
- Eager Fetching: সম্পর্কিত entities অটোমেটিক্যালি লোড হবে যখন মূল entity লোড হবে।
Lazy Loading Example:
@OneToMany(mappedBy = "author", fetch = FetchType.LAZY)
private Set<Book> books;
এখানে Lazy loading এর মাধ্যমে books collection কেবল তখনই লোড হবে যখন এটি প্রোগ্রামmatically অ্যাক্সেস করা হবে।
5. Database Schema and Foreign Key Constraints
Hibernate One-to-Many এবং Many-to-One সম্পর্কের মাধ্যমে ডেটাবেসে foreign key constraints তৈরি করে।
- One-to-Many: এখানে Many entity (Book) টেবিলের মধ্যে foreign key হিসাবে One entity (Author) এর আইডি রাখা হবে।
- Many-to-One: একাধিক Book একই Author এর সাথে সম্পর্কিত থাকে, তাই Book টেবিলের মধ্যে Author এর প্রাইমারি কী foreign key হিসাবে ব্যবহৃত হবে।
- One-to-Many সম্পর্ক Author এর মতো একাধিক ইনস্ট্যান্সের সাথে সম্পর্কিত হতে পারে, যেমন Book।
- Many-to-One সম্পর্ক অনেক গুলি Book এর মধ্যে একটি Author সম্পর্কিত থাকে।
- Hibernate এ এই সম্পর্কগুলো @OneToMany এবং @ManyToOne অ্যানোটেশন দিয়ে কনফিগার করা হয়, এবং cascade, fetch type, foreign key constraints এর মাধ্যমে সম্পর্কিত ডেটাবেস টেবিলের মধ্যে সম্পর্ক তৈরি হয়।